上篇介紹了 RDBMS 的擴展方式: replica, sharding, consensus
由於這些擴展方式也都適用於 NoSQL Database
並且相較於 RDBMS 需要自己實作擴展, NoSQL Database 通常已經實作好, 只要寫設定檔即可
此外, 這篇提到的擴展方式理論上也適用於 RDBMS, 只是由於需要自己實作
並且因為 ACID 特性的關係會很難處理, 所以不歸類在前篇內容
就像前篇提到的 訂房系統 的範例, 我們可以根據某個欄位 sharding, 將資料分散到不同伺服器
NoSQL Database 如 Cassandra 則使用如 Consistent Hashing 來分散資料
Consistent Hashing 讓 NoSQL Database 節點可以動態調整節點的數量, 同時保持資料分散儲存
這邊簡單介紹如何運作
問題是誰要負責處理第 3, 4 步呢?
各家 NoSQL Database 用不同的元件負責分配, 但主要有以下幾種
透過客戶端自行計算資料的 Hash 值並決定要存到哪個 Database 節點
好處是沒有中心化的節點, 避免了效能瓶頸和 SPOF
缺點是客戶端需要知道實作細節
如 Cassandra, Riak
由一個中心化的節點負責
好處是將請求的邏輯放在後端自行維護
缺點是容易有效能瓶頸和 SPOF
如 MongoDB 的 mongos
(題外話: 用過 BitTorrent 應該不陌生XD)
DHT 主要用在 去中心化 的分散式系統
相較於第一種客戶端僅負責計算 Hash 值和決定儲存的節點
DHT 中的 "所有節點" 都能夠儲存一部份的資料
也能夠讓其他節點取得這些資料
(題外話 2: 如同上篇提到的 共識演算法, 所有節點的責任相同)
好處是避免了中心化節點有的效能瓶頸 和 SPOF
缺點是要求每個節點都有足夠的資源計算並處理請求
如 Riak (Note: 沒查到官方文件, 從一些論壇看到的@@)